#ifndef __014CA97F_0CCB_4978_AAEB_EEAE5B1F61D2__
#define __014CA97F_0CCB_4978_AAEB_EEAE5B1F61D2__

#include "../import/head.h"
#include "../tools/head.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 
namespace xos
{
    class big_buf_impl;
    class buf_impl;

    // 
    // msg interface
    // 
    class msg_impl : public xos_stl::mem_pool_item< msg_impl, thread_lock >,
        public i_msg
    {
    public:
        typedef std::list< void * > VOID_LIST;
        typedef VOID_LIST::iterator VOID_ITER;

    public:
        msg_impl();
        ~msg_impl();

    public:
        // 
        // void data list
        // 
        VOID_LIST m_data_list;
        VOID_ITER m_begin;

        // 
        // additional variable
        // 
        i_runnable * m_lpRun[EXTRA_PARAM_NUM];
        big_buf_impl * m_lpBigBuf[EXTRA_PARAM_NUM];
        buf_impl * m_lpBuf[EXTRA_PARAM_NUM];
        char m_szStr[EXTRA_PARAM_NUM][1024];
        void * m_lpData[EXTRA_PARAM_NUM];
        double m_dlData[EXTRA_PARAM_NUM];
        int m_nData[EXTRA_PARAM_NUM];
        xos_i64 m_i64[EXTRA_PARAM_NUM];
        bool m_bData[EXTRA_PARAM_NUM];

    public:
        int term_no_init();
        int init();
        int term();

    public:
        // 
        // go though
        // 
        void * begin();
        void * next();

        // 
        // front list operation
        // 
        int push_front( void * pData );
        void * front();
        void pop_front();

        // 
        // back list operation
        // 
        int push_back( void * pData );
        void * back();
        void pop_back();

        // 
        // string
        // 
        const char * get_str( int nIndex, char * lpszStr, int nLen, int * lpnLenNeeded );
        int set_str( int nIndex, const char * lpszStr );

        // 
        // i_big_buf
        // 
        i_big_buf * get_big_buf( int nIndex, i_big_buf ** lppBigBuf );
        int set_big_buf( int nIndex, i_big_buf * lpBigBuf );

        // 
        // i_buf
        // 
        i_buf * get_buf( int nIndex, i_buf ** lppBuf );
        int set_buf( int nIndex, i_buf * lpBuf );

        // 
        // double
        // 
        double get_double( int nIndex, double * lpdlData );
        int set_double( int nIndex, double dlData );

        // 
        // void *
        // 
        void * get_void( int nIndex, void ** lppData );
        int set_void( int nIndex, void * lpData );

        // 
        // int
        // 
        int get_int( int nIndex, int * lpnInt );
        int set_int( int nIndex, int nInt );

        // 
        // xos_i64
        // 
        xos_i64 get_i64( int nIndex, xos_i64 * lpi64 );
        int set_i64( int nIndex, xos_i64 i64 );

        // 
        // bool
        // 
        bool get_bool( int nIndex, bool * lpBool );
        int set_bool( int nIndex, bool bBool );

        // 
        // runnable
        // 
        i_runnable * get_runnable( int nIndex, i_runnable ** lppRun );
        int set_runnable( int nIndex, i_runnable * lpRun );

        // 
        // release
        // 
        int release_no_init();
        int release();
    };
}

#endif // __014CA97F_0CCB_4978_AAEB_EEAE5B1F61D2__
